package com.ld.control.business.variable.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ld.control.business.process.model.ProcessNodeParamTmpModel;
import com.ld.control.business.task.model.TaskExampleModel;
import com.ld.control.business.variable.model.VariableExampleModel;
import com.ld.control.business.variable.vo.req.VariableExampleReqVo;
import com.ld.control.business.variable.vo.resp.VariableExampleResp;
import com.ld.control.business.variable.vo.resp.VariableExampleValueResp;
import org.apache.ibatis.annotations.Param;

/**
 * <p>
 * 变量实例表 服务类
 * </p>
 *
 * @author wangfeng
 * @since 2024-04-23
 */
public interface VariableExampleService extends IService<VariableExampleModel> {

    /**
     * 获取某个变量实例的详情
     * @param id
     * @return
     */
    VariableExampleResp getById(Long id);

    IPage<VariableExampleResp> getPageList(String name, String taskExampleCode, Long taskSubExampleId,
                                           Long variableId, Integer current, Integer size);


    void add(VariableExampleReqVo reqVo);

    /**
     * 获取子任务里面的变量信息
     * @param subTaskId
     * @param variableName
     * @return
     */
    VariableExampleModel getSubTaskVariable(Long subTaskId, String variableName);

    /**
     * 获取任务里面的变量信息
     * @param taskId
     * @param variableName
     * @return
     */
    VariableExampleModel getTaskVariable(Long taskId, String variableName);

    /**
     * 子任务变量设计
     * @param subTaskId
     * @param variableName
     * @param variableValue
     */
    void setSubTaskVariable(Long subTaskId, String variableName, String variableValue);

    /**
     * 给某个变量设置值，如果是数组变量则会自动往后添加坐标
     *  isCover 如果是true的话则直接覆盖原来变量值
     *  false并且是数组变量 是追加到数组最后一位 一般用于数组变量
     * @param id
     * @param variableValue
     * @param isCover
     */
    void setVariableValueById(Long id, String variableValue, boolean isCover);

    String getArrayDataByPosition(Long id, Integer position, Boolean moveFlag);

    /**
     * 根据变量名称获取信息后插入变量实例
     * @param variableName
     * @param processNodeExampleId
     */
    VariableExampleModel initVariableExampleInfo(String variableName, Long processNodeExampleId);

    /**
     * 根据变量实例名称回去变量信息
     * 只是获取数据就算是数组也不会动偏移量
     * @param variableName
     * @return
     */
    VariableExampleModel getByName(Long processNodeExampleId, String variableName);

    /**
     * 根据变量实例名称回去变量信息，如果是数组变量则会自动移动index
     * @param processNodeExampleId
     * @param variableName
     * @return
     */
    VariableExampleValueResp getByNameExt(Long processNodeExampleId, String variableName);
    VariableExampleModel getByTaskExampleId(Long taskExampleId, String variableName);
    VariableExampleModel getBySubTaskExampleId(Long subTaskExampleId, String variableName);

    /**
     * 任务变量模板中一个变量实例化一次，并且绑定一个值
     * @param  taskExampleModel
     * @param variableName
     * @param variableValue
     */
    void bindTaskVariable(TaskExampleModel taskExampleModel, String variableName, String variableValue);
}
